package com.dhl.cloud.common.util;

import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang3.StringEscapeUtils;


/**
 * 字符串工具类, 继承org.apache.commons.lang3.StringUtils类
 *
 */
public class StringUtils extends org.apache.commons.lang3.StringUtils {
    private static String encode[] = new String[]{
            "UTF-8",
            "ISO-8859-1",
            "GB2312",
            "GBK",
            "GB18030",
            "Big5",
            "Unicode",
            "ASCII"
    };

    /**
     * 去除小数点后面的0
     * @param str
     * @return
     */
    public static String removeZero(String str) {
        if (StringUtils.isNotBlank(str)) {
            BigDecimal value = new BigDecimal(str);
            BigDecimal noZeros = value.stripTrailingZeros();
            return noZeros.toPlainString();
        } else {
            return str;
        }
    }

    public static String lowerFirst(String str) {
        if (StringUtils.isBlank(str)) {
            return "";
        } else {
            return str.substring(0, 1).toLowerCase() + str.substring(1);
        }
    }

    public static boolean isNull(CharSequence character){
        return null == character;
    }

    public static boolean isNotNull(CharSequence character){
        return !isNull(character);
    }

    public static String upperFirst(String str) {
        if (StringUtils.isBlank(str)) {
            return "";
        } else {
            return str.substring(0, 1).toUpperCase() + str.substring(1);
        }
    }

    public static boolean listIsNotNull(List<?> list) {
        if (list != null && list.size() > 0) {
            return true;
        }
        return false;
    }

    /**
     * 替换掉HTML标签方法
     */
    public static String replaceHtml(String html) {
        if (isBlank(html)) {
            return "";
        }
        String regEx = "<.+?>";
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(html);
        String s = m.replaceAll("");
        return s;
    }

    /**
     * 缩略字符串（不区分中英文字符）
     *
     * @param str    目标字符串
     * @param length 截取长度
     * @return
     */
    public static String abbr(String str, int length) {
        if (str == null) {
            return "";
        }
        try {
            StringBuilder sb = new StringBuilder();
            int currentLength = 0;
            for (char c : replaceHtml(StringEscapeUtils.unescapeHtml4(str)).toCharArray()) {
                currentLength += String.valueOf(c).getBytes("GBK").length;
                if (currentLength <= length - 3) {
                    sb.append(c);
                } else {
                    sb.append("...");
                    break;
                }
            }
            return sb.toString();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return "";
    }

    /**
     * 缩略字符串（替换html）
     *
     * @param str    目标字符串
     * @param length 截取长度
     * @return
     */
    public static String rabbr(String str, int length) {
        return abbr(replaceHtml(str), length);
    }


    /**
     * 转换为Double类型
     */
    public static Double toDouble(Object val) {
        if (val == null) {
            return 0D;
        }
        try {
            return Double.valueOf(trim(val.toString()));
        } catch (Exception e) {
            return 0D;
        }
    }

    /**
     * 转换为Float类型
     */
    public static Float toFloat(Object val) {
        return toDouble(val).floatValue();
    }

    /**
     * 转换为Long类型
     */
    public static Long toLong(Object val) {
        return toDouble(val).longValue();
    }

    /**
     * 转换为Integer类型
     */
    public static Integer toInteger(Object val) {
        return toLong(val).intValue();
    }

    public static String getUTF8String(String string) {
        if (StringUtils.isBlank(string)) {
            return string;
        }
        String encoding = getEncoding(string);
        if (null == encoding) {
            return string;
        }
        try {
            return new String(string.getBytes(encoding), "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return string;
    }


    public static String getEncoding(String str) {
        byte[] data = str.getBytes();
        byte[] b = null;
        for (int i = 0; i < encode.length; i++) {
            try {
                b = str.getBytes(encode[i]);
                if (b.length != data.length) continue;
                if (!Arrays.equals(b, data)) {
                    continue;
                }
                return encode[i];
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
                continue;
            }
        }
        return null;
    }

    /**
     * 格式化字符串<br>
     * 此方法只是简单将占位符 {} 按照顺序替换为参数<br>
     * 如果想输出 {} 使用 \\转义 { 即可，如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>
     * 例：<br>
     * 通常使用：format("this is {} for {}", "a", "b") =》 this is a for b<br>
     * 转义{}： 	format("this is \\{} for {}", "a", "b") =》 this is \{} for a<br>
     * 转义\：		format("this is \\\\{} for {}", "a", "b") =》 this is \a for b<br>
     *
     * @param strPattern 字符串模板
     * @param argArray   参数列表
     * @return 结果
     */
//    public static String format(final String strPattern, final Object... argArray) {
//        return StringFormat.format(strPattern, argArray);
//    }
    
    /**
     * 26个英文字母转成数字
     * @param character
     * @return
     */
    public static String convertChar(String character)
    {
    	return String.valueOf(character.toUpperCase().hashCode() - 64);
    }
}
